﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using DevComponents.DotNetBar;
using BusinessLogicLayer;
using DataAccessLayer;
using BusinessLogicLayer.Validation;
using Entities;

namespace QuanLyTKB_TienDoGD.QuanLyKeHoachGD
{
    public partial class frmQuanLyKeHoachGiangDay : Office2007Form
    {
        private IRepository<QuanLyKeHoachGiangDay> _repository; // khai báo thuộc tính _repository
        private QuanLyKeHoachManager _manager;  // khai báo thuộc tính _manager
        private QuanLyKeHoachGiangDay ql;   // khai báo thuộc tính ql

        public frmQuanLyKeHoachGiangDay()
        {
            InitializeComponent();
        }

        /// <summary>
        /// sự kiện load form
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void frmQuanLyKeHoachGiangDay_Load(object sender, EventArgs e)
        {
            _repository = new Repository<QuanLyKeHoachGiangDay>();
            _manager = new QuanLyKeHoachManager(_repository);
            dgvQuanLyKeHoachGiangDay.DataSource = _repository.GetAll().ToList();
            LoadCbbLopHoc();
            LoadCbbGiaoVien();

        }

        /// <summary>
        /// lấy toàn bộ và hiển thị lớp học lên combobox
        /// </summary>
        private void LoadCbbLopHoc()
        {
            List<LopHoc> list = LopHoc.Repository.GetAll().ToList();
            LopHoc lh = new LopHoc();
            lh.MaLop = "------- All -------";
            list.Insert(0, lh);
            cbbTimKiemTheoLopHoc.DataSource = list;
            cbbTimKiemTheoLopHoc.DisplayMember = "MaLop";
            cbbTimKiemTheoLopHoc.ValueMember = "MaLop";
            cbbTimKiemTheoLopHoc.SelectedIndex = 0;
        }

        /// <summary>
        /// Lấy toàn bộ mã giáo viên 
        /// nhưng hiển thị tên giáo viên lên combobox
        /// </summary>
        public void LoadCbbGiaoVien()
        {
            List<GiaoVien> list = GiaoVien.Repository.GetAll().ToList();
            GiaoVien gv = new GiaoVien();
            gv.TenGV = "------- All -------";
            list.Insert(0, gv);
            cbbTimKiemTheoTenGiaoVien.DataSource = list;
            cbbTimKiemTheoTenGiaoVien.DisplayMember = "TenGV";
            cbbTimKiemTheoTenGiaoVien.ValueMember = "MaGV";
            cbbTimKiemTheoTenGiaoVien.SelectedIndex = 0;
        }

        /// <summary>
        /// xử lý sự kiện làm mới kế hoạch giảng dạy
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnLamMoi_Click(object sender, EventArgs e)
        {
            dgvQuanLyKeHoachGiangDay.DataSource = _repository.GetAll().ToList();
        }

        /// <summary>
        /// xử lý sự kiện khi nhấn vào button thêm 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnThem_Click(object sender, EventArgs e)
        {
            var frm = new frmThemKeHoachGiangDay(_manager, this);
            frm.Show();
        }

        /// <summary>
        /// xử lý sự kiện khi nhấn vào button cập nhật
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnCapNhat_Click(object sender, EventArgs e)
        {
            if (dgvQuanLyKeHoachGiangDay.SelectedRows.Count > 0)
            {
                ql = new QuanLyKeHoachGiangDay();
                DataGridViewRow dgrow = dgvQuanLyKeHoachGiangDay.SelectedRows[0];
                ql.MaQL = dgrow.Cells[0].Value.ToString();
                ql.NamHoc = dgrow.Cells[1].Value.ToString();
                ql.HocKy = dgrow.Cells[2].Value.ToString();

                var frm = new frmThemKeHoachGiangDay(_manager, this, ql);
                frm.Show();
                dgvQuanLyKeHoachGiangDay.DataSource = _repository.GetAll().ToList();
            }
            else MessageBox.Show("Vui lòng chọn kế hoạch để cập nhật", "Thông Báo");

        }

        /// <summary>
        /// xử lý sự kiện khi nhấn vào button xóa
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnXoaKeHoach_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Bạn có muốn xóa các kế hoạch", "Thông báo", MessageBoxButtons.OKCancel) == DialogResult.Cancel)
                return;
            foreach (DataGridViewRow dr in dgvQuanLyKeHoachGiangDay.Rows)
            {
                if (dr.Cells[0].Value.ToString() != "0")
                {
                    MessageBox.Show("Bạn phải xóa hết chi tiết kế hoạch trước khi xóa quản lý kế hoạch.", "Thông báo");
                    return;
                }
                    
                _manager.Delete(dr.Cells[0].Value.ToString());
            }
            dgvQuanLyKeHoachGiangDay.DataSource = _repository.GetAll().ToList();
        }

        /// <summary>
        /// xử lý sự kiện khi chọn lớp học
        /// thì lớp học đó có trong kế hoạch giảng dạy không
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void cbbTimKiemTheoLopHoc_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cbbTimKiemTheoLopHoc.SelectedIndex == 0)
                btnLamMoi.PerformClick();
            else {
                List<QuanLyKeHoachGiangDay> ds = new List<QuanLyKeHoachGiangDay>();
                ds = _repository.GetAll().ToList();
                List<QuanLyKeHoachGiangDay> kq = new List<QuanLyKeHoachGiangDay>();
                foreach (QuanLyKeHoachGiangDay ql in ds)
                    if (KiemTraLopHocCoTrongKeHoachKhong(ql, cbbTimKiemTheoLopHoc.Text))
                        kq.Add(ql);
                dgvQuanLyKeHoachGiangDay.DataSource = kq;

            }
        }

        /// <summary>
        /// Xử lý sự kiện khi chọn giáo viên
        /// thì kiểm tra xem giáo viên đó có trong kế hoạch giảng dạy không
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void cbbTimKiemTheoTenGiaoVien_SelectedIndexChanged(object sender, EventArgs e)
        {
            cbbTimKiemTheoLopHoc.SelectedIndex = 0;
            if (cbbTimKiemTheoTenGiaoVien.SelectedIndex == 0)
                btnLamMoi.PerformClick();
            else {
                List<QuanLyKeHoachGiangDay> ds = new List<QuanLyKeHoachGiangDay>();
                ds = _repository.GetAll().ToList();
                List<QuanLyKeHoachGiangDay> kq = new List<QuanLyKeHoachGiangDay>();
                foreach (QuanLyKeHoachGiangDay ql in ds)
                {
                    if (KiemTraGiaoVienCoTrongKeHoachKhong(ql, cbbTimKiemTheoTenGiaoVien.SelectedValue.ToString()))
                        kq.Add(ql);
                }
                dgvQuanLyKeHoachGiangDay.DataSource = kq;
            }
            
        }

        /// <summary>
        /// xử lý sự kiện tìm kiếm thao năm học
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void txtTimKiemTheoNamHoc_TextChanged(object sender, EventArgs e)
        {
            cbbTimKiemTheoLopHoc.SelectedIndex = 0;
            cbbTimKiemTheoTenGiaoVien.SelectedIndex = 0;
            var result = _manager.Find(s => s.NamHoc.IndexOf(txtTimKiemTheoNamHoc.Text) >= 0);
            if (result.Success)
                dgvQuanLyKeHoachGiangDay.DataSource = result.Result;
            else dgvQuanLyKeHoachGiangDay.DataSource = null;
        }

        /// <summary>
        /// kiểm tra lớp học có trong kế hoạch giảng dạy không
        /// </summary>
        /// <param name="ql"></param>
        /// <param name="lh"></param>
        /// <returns></returns>
        private bool KiemTraLopHocCoTrongKeHoachKhong(QuanLyKeHoachGiangDay ql, string lh)
        {
            bool kq = false;
            List<ChiTietKeHoachGiangDay> list = ChiTietKeHoachGiangDay.Repository.Find(s => s.MaQL == ql.MaQL).ToList();
            foreach (ChiTietKeHoachGiangDay t in list)
                if (t.MaLop == lh) return true;
            return kq;
        }

        /// <summary>
        /// kiểm tra xem giáo viên đó có trong kế hoạch giảng dạy không
        /// </summary>
        /// <param name="ql"></param>
        /// <param name="gv"></param>
        /// <returns></returns>
        public bool KiemTraGiaoVienCoTrongKeHoachKhong(QuanLyKeHoachGiangDay ql, string gv)
        {
            bool kq = false;
            List<ChiTietKeHoachGiangDay> list = ChiTietKeHoachGiangDay.Repository.Find(s => s.MaQL == ql.MaQL).ToList();
            foreach (ChiTietKeHoachGiangDay ct in list)
                if (ct.MaGV == gv) return true;
            return kq;
        }

        /// <summary>
        /// xử lý sự kiện khi kết thúc việc sửa dữ liệu của một ô
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dgvQuanLyKeHoachGiangDay_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == 0 && dgvQuanLyKeHoachGiangDay.Rows[e.RowIndex].Cells[0].Value != null)
            {
                bool select = (bool)dgvQuanLyKeHoachGiangDay.Rows[e.RowIndex].Cells[0].Value;
                dgvQuanLyKeHoachGiangDay.Rows[e.RowIndex].Selected = select;
            }
        }

        /// <summary>
        /// xử lý sự kiện xảy ra khi người dùng nhấp vào một tiêu đề cột.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dgvQuanLyKeHoachGiangDay_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            if (e.ColumnIndex == 0 && dgvQuanLyKeHoachGiangDay.Rows.Count > 0)
            {
                for (int i = 0; i < dgvQuanLyKeHoachGiangDay.Rows.Count; i++)
                {
                    bool select = dgvQuanLyKeHoachGiangDay.Rows[i].Selected;
                    dgvQuanLyKeHoachGiangDay.Rows[i].Cells[0].Value = select;
                }
            }
        }



    }
}
